package com.zlj.jdbc.transfer.jdbcUtils03;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
	
	 private static ComboPooledDataSource dataSource ;
	 
	 //事务的专用连接
	 //ThreadLocal保证每个线程都有一个单独的连接
	 private static ThreadLocal<Connection> t1 = new ThreadLocal<Connection>();
	
	 static {
	    	dataSource = new ComboPooledDataSource();
	    }
	    
	    /**
	     * 使用连接池返回一个连接对象
	     * @return
	     * @throws SQLException
	     */
	    public static Connection getConnection() throws SQLException {
	    	Connection conn = t1.get();   //获取当前线程的专用连接
	    	//若conn不为null，说明已经调用了beginTransaction()方法，表示已经开启了事务
	    	if(conn != null) {
	    		return conn;
	    	}
	    	return dataSource.getConnection();
	    }
	    
	    /**
	     * 返回连接池对象
	     * @return
	     */
	    public static DataSource getDataSource() {
	    	return dataSource;
	    }
	    
	    /*
	     * 开启事务：
	     * 1、获取一个Connection,设置它的setAutoCommit(false);
	     * 2、保证dao中使用的连接是上面创建的那个
	     * 
	     * ----------------------
	     * 创建一个Connection，设置为手动提交
	     * 把这个Connection给dao用
	     * 并且commitTransaction 和  rollbackTransaction都可以获取的到
	     */
	    public static void beginTransaction() throws SQLException {
	    	Connection conn = t1.get();
	    	if(conn != null) {
	    		throw new SQLException("已经开启了事务，就不要重复开启了！");
	    	}
	    	/*
	    	 * 1、给conn赋值；
	    	 * 2、给conn设置为手动提交；
	    	 */
	    	conn = getConnection();  //给conn赋值，表示事务已经开启
	    	conn.setAutoCommit(false);
	    	t1.set(conn);  //把当前线程的连接保存起来
	    }
	    
	    /**
	     * 提交事务
	     * 1、获取beginTransaction中获取的Connection，然后调用commit方法
	     * @throws SQLException 
	     */
	    public static void commitTransaction() throws SQLException {
	    	Connection conn = t1.get();
	    	if(conn == null) {
	    		throw new SQLException("还没有开启事务，不能提交！");
	    	}
	    	conn.commit();
	    	conn.close();
	    	t1.remove();
	    }
	    
	    /**
	     * 回滚事务
	     * 1、获取beginTransaction中获取的Connection，然后调用rollback方法
	     * @throws SQLException 
	     */
	    public static void rollbackTransaction() throws SQLException {
	    	Connection conn = t1.get();
	    	if(conn == null) {
	    		throw new SQLException("还没有开启事务，不能回滚！");
	    	}
	    	conn.rollback();
	    	conn.close();
	    	t1.remove();
	    }
	    
	    /**
	     * 释放事务
	     */
	    public static void releaseTransaction(Connection connection) {
	    	Connection conn = t1.get();
	    	if(conn == null) {
	    		try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
	    	}
	    	
	    	if(conn != connection) {
	    		try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
	    	}
	    }
}
